package _11_位运算;

import java.util.Arrays;

public class _260_只出现一次的数字III {

    public static void main(String[] args) {
        _260_只出现一次的数字III v = new _260_只出现一次的数字III();

        int value = -2;
        System.out.println(Integer.toBinaryString(-2));
        System.out.println(value & -value);
        System.out.println(Integer.toBinaryString(value & -value));

        int[] ins = {1, 2, 1, 3, 2, 5};
        System.out.println(Arrays.toString(v.singleNumber(ins)));
    }

    public int[] singleNumber(int[] nums) {
        // 对所有元素异或
        int value = 0;
        for (int num : nums) {
            value ^= num;
        }
        // 获取value中的某一位1
        int compare = value & -value;
        // 当前值为只出现两次元素的异或值. 因为是这两个元素异或，所以每一位都不相同，所以在次对所有元素分组异或，最终分组后的结果就是答案
        int first = 0;
        int second = 0;
        for (int num : nums) {
            // 异或值非0，或者不是0
            if ((compare & num) == 0) {
                first ^= num;
            } else {
                second ^= num;
            }
        }
        return new int[]{first, second};
    }

}
